home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
tools
/
cddasub
/
cddasub.s
< prev
next >
Wrap
Text File
|
2000-05-19
|
11KB
|
680 lines
.include IOCSCALL.MAC
.include DOSCALL.MAC
.include SCSICALL.MAC
.include TNB.MAC
HEAD1 = '*CDD'
HEAD2 = 'S001'
StartStatio:*******************常駐部ここから
SS:
.dc.l -1
.dc.w $8000.w
.dc.l STRR
.dc.l ETYP
dhead: .dc.l HEAD1,HEAD2
STRA5: .dc.l $0.l
STRR: move.l a5,STRA5
rts
ETYP:
movem.l d0/a5,-(a7)
movea.l STRA5(pc),a5
bsr.s ETYPSUB
move.b d0,$3(a5)
lsr.w #8,d0
move.b d0,$4(a5)
movem.l (a7)+,d0/a5
rts
ETYPSUB:
tst.b $2(a5)
beq.w ETYP_KEEP
move.w #$5003,d0 *err
rts
*********************************************
head:
.dc.l HEAD1
.dc.l HEAD2
.even
SCALL_JPT:
.dc.l 0
SCALL: *=========================================
* ($1F5)
* SCSI IOCS
*
SCALL__ = $1F5
SCALL_ = $07D4.w
*======= コマンドによって分岐
cmpi.w #_S_SELECT,d1
beq SEL_DISP
cmpi.w #_S_SELECTA,d1
beq SEL_DISP
cmpi.w #_S_CMDOUT,d1
bne SCALL_JMP
*----- cmdout
move.w SELID,d0 * SCSI-ID
cmp.w ID+2(pc),d0 * IDは一致?
bne SCALL_JMP
cmpi.b #$d8,(a1) * SONY CDU-561 音声トラック読み込みコマンド?
bne SCALL_JMP
*------ Read CD-DA コマンドすげ替え ( SONY CDU-561 => General SCSI-3 )
move.l a0,-(sp)
lea.l CmdBuf(pc),a0
move.b 2(a1),2(a0) * 開始ブロックアドレス
move.b 3(a1),3(a0)
move.b 4(a1),4(a0)
move.b 5(a1),5(a0)
clr.b 6(a0) * 転送ブロック長
move.b 8(a1),7(a0)
move.b 9(a1),8(a0)
movea.l (sp)+,a0
move.l a1,-(sp) * 一時退避
lea.l CmdBuf(pc),a1
bsr SCALL_JMP * CMDOUT!!
movea.l (sp)+,a1 * 戻す
rts
SEL_DISP:
*----- selection
move.w d4,SELID * 記憶
SCALL_JMP::
move.l SCALL_JPT(pc),-(sp)
rts
*-------------------------*
.even
__COM__:
SELID:
.dc.w 0 * S_SELECT* した ID
ID:
.dc.l -1 * せつぞく
StaMod:
.dc.b 0
.even
CmdBuf: * Read CD-DA コマンドすげ替え用バッファ
.dc.b $BE ** General SCSI-3 CD読込コマンド
.dc.b $00 ** Sector Type ??
.dc.b $00,$00,$00,$00 ** 開始ブロックアドレス
.dc.b $00,$00,$00 ** 転送ブロック長
.dc.b $10 ** 読込モード指定
.dc.b $00 ** サブチャンネル選択
.dc.b $00 ** Control ??
.even
__COM__S:
EndStatio:*******************常駐部ここまで
MarkerChk:*----------------------------------------
* a0 アドレス
*
*[戻り値] bne ちがう
* beq あっている
* cmpa.l #$F0000000,a0
* bcc @f
cmp.l #HEAD1,(a0)
bne @f
cmp.l #HEAD2,4(a0)
bne @f
cmpa.l a0,a0 *z=1
@@:
rts
InvChk:*----------------------------------------
* a0.l==なら非常駐
* a0.l!=なら常駐
movea.l (a0),a0 *一つ前のポインタ
cmpa.l #$F0000000,a0
bcc IC1
cmp.l #HEAD1,$0100+(head-SS)(a0)
bne @f
cmp.l #HEAD2,$0104+(head-SS)(a0)
bne @f
adda.l #$100,a0 **[SS]のポインタ
rts
@@: **違う
tst.l (a0) *一つ前のポインタ
bne InvChk *0でない(上へ)
IC1: sub.l a0,a0 *非常駐
rts
DevChk:*----------------------------------------
* a0.l==なら非常駐
* a0.l!=なら常駐
movea.l #$6800,a0
DC1: cmp.l #'NUL ',(a0)
bne @f
cmp.l #' ',4(a0)
bne @f
bra DC4
@@:
addq.l #2,a0
bra DC1 *絶対あるはず。。
DC4:
move.l d0,-(sp)
suba.l #(dhead-SS),a0 *リンクポインタ
DC2: movea.l (a0),a0
move.l a0,d0
bmi DC3
cmp.l #HEAD1,(dhead-SS)(a0)
bne DC2
cmp.l #HEAD2,(dhead-SS)+4(a0)
bne DC2
cmp.l #HEAD1,(head-SS)(a0)
bne DC2
cmp.l #HEAD2,(head-SS)+4(a0)
bne DC2
*あった
move.l (sp)+,d0
rts
DC3:
move.l (sp)+,d0
sub.l a0,a0 *非常駐
rts
AtoI:*----------------------------------------
* a2 アドレス
*[戻り値] d0.l 数字
moveq #0,d0
move.b (a2),d2
cmpi.b #'$',d2
jbeq AtoHI
@@: move.b (a2)+,d2
subi.b #'0',d2
jbcs AIr
cmpi.b #9,d2
jbhi AIr
andi.l #$0000FF,d2
mulu #10,d0
add.l d2,d0
jbra @b
AIr: subq #1,a2
rts
AtoHI:
*(Hex専用)
move.b (a2)+,d2 *$ skip
@@: move.b (a2)+,d2
subi.b #'0',d2
jbcs AHIL1
cmpi.b #9,d2
jbhi AHIL1
lsl.l #4,d0
add.l d2,d0
jbra @b
AHIL1:
ori.b #$20,d2
subi.b #'a'-'0',d2
jbcs AHIL2
cmpi.b #5,d2
jbhi AHIL2
lsl.l #4,d0
addi.l #10,d0
add.l d2,d0
jbra @b
AHIL2: subq #1,a2
rts
clcf: .dc.w 0
cmdlinchk:*------------------------------------------------------------------
* in a2 = 文字列
* out d0.b 0 ; OK
* -1 ; LINEERR
* -2 ; COMDERR
* -100; その他
* 'h' ; -?
* 'h' ; -H
* 'r' ; -R
*
clr.w clcf
bra sw
cmdlinchkD: ** DEVICE エントリ用
move.w #-1,clcf
sw: move.b (a2)+,d0
bne 1f
*======終わり?
tst.w clcf
bne @f
*======COMLINE からなので終わり
moveq #0,d0
rts
@@: *====== DEVICE
move.b (a2),d0
bne sw
moveq #0,d0 * 0が連続なので終わり
rts
1:
cmpi.b #' ',d0
beq sw
cmpi.b #$09,d0 *tab
beq sw
cmpi.b #'-',d0
beq swc
cmpi.b #'/',d0
beq swc
*======数字?
cmpi.b #'$',d0
beq @f
cmpi.b #'0',d0
bcs swe
cmpi.b #'9'+1,d0
bcc swe
@@: *======数字だ
subq.l #1,a2
bsr AtoI
move.l d0,ID
bra sw
swe: *======コマンドラインが異常
moveq #-1,d0
rts
swc:
*======スイッチ判断
move.b (a2)+,d0
beq swe
cmpi.b #'?',d0
bne @f
moveq #'h',d0
rts
@@:
ori.b #$20,d0 *小文字化!
cmpi.b #'e',d0
beq cl_eje
cmpi.b #'n',d0
beq cl_nnn
cmpi.b #'r',d0
beq clcrts
cmpi.b #'h',d0
beq clcrts
@@:
moveq #-2,d0
clcrts:
rts
cl_nnn:
*----- /N
move.w #-1,SWC_N
bra sw
cl_eje:
*----- MEDIA を EJECT する!
move.l ID(pc),d4
SCSI _S_TESTUNIT
tst.l d0
beq @f
SCSI _S_TESTUNIT
tst.l d0
beq @f
SCSI _S_TESTUNIT
tst.l d0
beq @f
bra 1f
@@:
moveq #$00,d3
SCSI _S_PAMEDIUM
lea.l work(pc),a1
moveq #18,d3
SCSI _S_REQUEST
moveq #$02,d3 *EJECT
bsr scsi_startstop
tst.l d0
beq 1f
SCSI _S_STARTSTOP
1:
bra sw
ETYP_KEEP:*----------------------------------------
**常駐!
movem.l d1-d7/a0-a6,-(sp)
suba.l a3,a3
Print CRLF(pc)
Print LR1(pc)
movea.l 18(a5),a2
@@: move.b (a2)+,d0 **ファイル名スキップ
bne @b
bsr cmdlinchkD *a2 に文字列もって bsr
tst.b d0
bne @f
move.l ID(pc),d4
bpl @f
Print LRNI(pc)
bra EK_ERR
@@:
bsr keepdisp
Print LR2(pc)
move.b #-1,StaMod
move.l #EndStatio,$e(a5)
movem.l (sp)+,d1-d7/a0-a6
moveq #$0,d0
rts
@@:
cmpi.b #-100,d0
beq EK_ERR
cmpi.b #-1,d0
bne @f
Print LR6(pc)
bra EK_ERR
@@:
Print LR7(pc)
EK_ERR:
movem.l (sp)+,d1-d7/a0-a6
move.w #$700d,d0
rts
lds_chk:*------------------------------------------------------------------
* inquiry が返ってこなかったら -1
* CD-ROM デバイスなら 0
* それ以外は違う
.if 0
movem.l d1-d7/a0-a6,-(sp)
lea work(pc),a1
moveq #36,d3
SCSI _S_INQUIRY
tst.l d0
beq @f
SCSI _S_INQUIRY
tst.l d0
beq @f
SCSI _S_INQUIRY
tst.l d0
beq @f
moveq #-1,d0
bra 1f
@@:
move.l #'IODA',d0
cmp.l 8(a1),d0
bne 1f
move.l #'LS-1',d0
cmp.l 16(a1),d0
bne 1f
moveq #0,d0
1: movem.l (sp)+,d1-d7/a0-a6
.else
moveq #0,d0
.endif
rts
init:*------------------------------------------------------------------
lea _usp(pc),sp
Print LR1(pc)
** 常駐チェック **
suba.l a1,a1
SUPER
movea.l d0,a1
moveq #0,d1
bsr InvChk
move.l a0,d0
bne @f
bsr DevChk
@@: movea.l a0,a3 *常駐先頭アドレス
movea.l SCALL_,a0
suba.l #SCALL-head,a0
bsr MarkerChk
bne @f
bset #0,d1
@@:
*d1に常駐状態
USER
** 常駐していたらそのデータを引用 **
move.l a3,d0
beq conl
suba.l a1,a1
SUPER
movea.l d0,a1
lea __COM__-SS(a3),a0
lea __COM__,a6
move.l #(__COM__S-__COM__)/2-1,d0
@@: move.w (a0)+,(a6)+
dbra d0,@b
USER
conl:
tst.b (a2)+ *スキップ
bsr cmdlinchk *a2 に文字列もって bsr
tst.b d0
bne 1f
bra keep
1:
cmpi.b #-100,d0
bne @f
DOS _EXIT
@@:
cmpi.b #-1,d0
bne @f
pea LR6(pc)
bra PE *end
@@:
cmpi.b #'r',d0
beq free
cmpi.b #'h',d0
beq help
pea LR7(pc) * -2 もここだ!
bra PE *end
help:
pea LRH(pc)
bra PE *end
keep: ************************** 常駐させる
move.l a3,d0
beq keepL1
*既に常駐、設定変更
suba.l a1,a1
SUPER
movea.l d0,a1
lea __COM__-SS(a3),a0
lea __COM__,a6
move.l #(__COM__S-__COM__)/2-1,d0
@@: move.w (a6)+,(a0)+
dbra d0,@b
USER
move.w MC(pc),d0
bne @f
pea LR5(pc)
bra PE *end
@@: pea LR5_(pc)
bra PE *end
keepL1:
**セット
move.l ID(pc),d4
bpl @f
pea LRNI(pc)
bra PE *end
@@:
suba.l a1,a1
SUPER
movea.l d0,a1
bsr keepdisp
USER
Print LR2(pc)
Print LRKP(pc)
clr.w -(sp)
move.l #EndStatio-StartStatio,-(sp)
DOS _KEEPPR
keepdisp:***************
lea SCALL_JPT(pc),a0
move.l SCALL_,(a0)
lea SCALL(pc),a0
move.l a0,SCALL_
move.l ID(pc),d0
divu #10,d0
addi.b #'0',d0
move.b d0,LR2_
swap d0
addi.b #'0',d0
move.b d0,LR2_+1
rts
free: *****************************常駐解除
move.l a3,d0
bne @f
pea LR8(pc) **非常駐
bra PE *end
@@:
tst.b StaMod
beq @f
pea LRCN(pc) **CONFIG常駐
bra PE *end
@@:
cmpi.w #$01,d1
beq @f
pea LR4(pc) **ベクタが占領
bra PE *end
@@:
suba.l a1,a1
SUPER
movea.l d0,a1
move.l (SCALL_JPT-SS)(a3),SCALL_
USER
sub.l #$00000F0,a3
move.l a3,-(sp)
DOS _MFREE
addq.l #4,sp
pea LR3(pc)
PE: DOS _PRINT
addq.l #4,sp
DOS _EXIT
scsi_cmd:*-----------------------------------------------------
link a6,#-4
movem.l d1-d4/a1,-(sp)
move.l 8(a6),d4
SCSI _S_SELECT
tst.l d0
beq @f
moveq #-4,d0
bra 2f
@@:
movea.l 16(a6),a1
move.l 12(a6),d3
SCSI _S_CMDOUT
tst.l d0
beq @f
moveq #-3,d0
bra 2f
@@:
lea -1(a6),a1
SCSI _S_STSIN
tst.l d0
bne 1f
lea -3(a6),a1
SCSI _S_MSGIN
tst.l d0
bne @f
moveq.l #0,d0
move.b -3(a6),d0
asl.l #8,d0
moveq.l #0,d1
move.b -1(a6),d1
add.l d1,d0
bra 2f
@@:
moveq #-1,d0
bra 2f
1:
moveq #-2,d0
2:
movem.l (sp)+,d1-d4/a1
unlk a6
rts
scsi_startstop:*-----------------------------------------
move.b d3,Com+4
pea Com(pc) *com
move.l #6,-(sp) *com長さ
move.l d4,-(sp) *ID
bsr scsi_cmd
lea 12(sp),sp
rts
Com:
.dc.b 27,1,0,0,0,0
.even
*------------------------------------------*
SWC_N:
.dc.w 0
MC: .dc.w 0 *モードをいじった
LR2: .dc.b ' ID '
LR2_: .dc.b '00 の Read CD-DA コマンドを SONY CDU-561 互換にしました。 ',$0d,$0a,0
LRKP: .dc.b ' 常駐しました。',$0d,$0a,0
LR3: .dc.b ' 常駐解除しました。',$0d,$0a,0
LR4: .dc.b ' ベクタが占領されています。',$0d,$0a,0
LR5: .dc.b ' 既に常駐しています。',$0d,$0a,0
LR5_: .dc.b ' 設定を変更しました。 ',$0d,$0a,0
LR6: .dc.b ' コマンドラインが異常です。',$0d,$0a,0
LR7: .dc.b ' スイッチが異常です。',$0d,$0a,0
LR8: .dc.b ' 常駐していません。',$0d,$0a,0
LRNI: .dc.b ' ID を指定して下さい。',$0d,$0a,0
LRNL: .dc.b ' LUN を指定して下さい。',$0d,$0a,0
LRCN: .dc.b ' CONFIG.SYSで登録されています。',$0d,$0a
.dc.b ' 常駐解除できません。',$0d,$0a,0
.even
LRH: .dc.b $0d,$0a
.dc.b '使用法:CDDASUB.x [ID] [switch] ',$0d,$0a
.dc.b ' /E ・・・・・・・・ メディアをイジェクトします。',$0d,$0a
* .dc.b ' /N ・・・・・・・・ デバイスチェックをしません。',$0d,$0a
.dc.b ' /R ・・・・・・・・ 常駐解除します。',$0d,$0a
.dc.b $0d,$0a
.dc.b '指定 ID( General SCSI-3 仕様 CD-ROM )の Read CD-DA コマンドを',$0d,$0a
.dc.b 'SONY CDU-561 互換にします。',$0d,$0a
.dc.b 'CONFIG.SYS の DEVICE= でも登録可能です。',$0d,$0a
.dc.b $0d,$0a
.dc.b 0
.even
LR1: .dc.b 'X68k CD-ROM SUB DRIVER Version 0.01 Copyright 2000 KIN',$0d,$0a
.dc.b 'Base : X68k DVD-RAM SUB DRIVER Version 0.02 (c)1998 TNB製作所'
CRLF: .dc.b $0d,$0a,0
.even
.bss
work:
.ds.b 256
.ds.b 1024
_usp:
.end init